home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / thbaba / thbaba.c next >
C/C++ Source or Header  |  1993-11-30  |  10KB  |  508 lines

  1.  
  2. /*
  3.     “THbaba”ババ抜き
  4.  
  5.         By 五味(93/09/15~93/09/16)
  6.              (93/09/25)
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <time.h>
  12. #include <ctype.h>
  13. #include <string.h>
  14.  
  15. #define    TRUE    1
  16. #define    FALSE    0
  17. #define    FAIL    -1
  18.  
  19. #define    PLAYERMAX 8
  20.     /* 最大プレイヤー数    */
  21.  
  22.  
  23.     char    *name[]={    "あなた","TAWAT'93","こば","Mr.THREE",
  24.                 "TON","かだお","さとおし","むろた"    };
  25.  
  26.     char    *suit[]={ "○","●","□","■"    };
  27.     char    *hsuit[]={ "#","$","@","+"};
  28. /*    char    *hsuit[]={ "","","",""};    */
  29.  
  30.     char    *numb[]={ "A","2","3","4","5","6","7","8","9","10",
  31.               "J","Q","K","JOKER" };
  32.     char    *hnumb[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K",
  33.               "joker" };
  34.  
  35.     char    *title=    "\n"
  36.             " “THbaba”ババ抜き V1.0a\n"
  37.             "  (c) H.Gomi 93/09/25\n\n";
  38.  
  39.     char    *usage=    "    [usage] THbaba [-h][-r][-pN][-n[N] NAME][-gN]\n"
  40.             "                   [-c][-o]\n"
  41.             "\n"
  42.             "  [options] -h      ソフトの説明\n"
  43.             "            -r      ルールの説明\n"
  44.             "            -pN     プレイヤー数\n"
  45.             "            -nN     プレイヤー名の変更\n"
  46.             "            -gN     最大ゲーム数\n"
  47.             "\n"
  48.             "            -c      ANK文字で表示\n"
  49.             "            -o      数字だけで表示\n";
  50.  
  51.     char    *rule=    "  [ルール説明]\n\n"
  52.             "   詳しいルールは書きませんが、とにかく\n"
  53.             "  同じ番号の二つのカードは捨てることが出\n"
  54.             "  来て、早くカードを無くした方が勝ちです。\n"
  55.             "  引かれて無くなった方と、引いてカードを\n"
  56.             "  捨てて無くなった方では、後者が先に上がっ\n"
  57.             "  たことになります。\n";
  58.  
  59.  
  60.     int    nplayer=4;        /* プレイヤー数            */
  61.     int    card[PLAYERMAX][54];    /* プレイヤーの保持カード    */
  62.     int    isdeal[54];        /* そのカードは配られたか?    */
  63.  
  64.     int    win[PLAYERMAX];        /* プレイヤーの勝ち数        */
  65.     int    gameno=1;        /* ゲーム数            */
  66.     int    gamemax=0;        /* 総ゲーム数            */
  67.  
  68.     int    ttbl[PLAYERMAX];    /* 一番~N番のプレイヤー番号    */
  69.     int    repnt;            /* 残っているポイント        */
  70.  
  71.  
  72. void put_score(void)        /* スコア表示    */
  73. {
  74.     int    i;
  75.  
  76.     printf(    "    名前  | 点数\n"
  77.         " ---------+------\n"    );
  78.  
  79.     for( i=0 ; i<nplayer ; i++ )
  80.         printf(" %8s | %3d\n",name[i],win[i]);
  81.  
  82.     printf("\n");
  83. }
  84.  
  85. void THbaba_end()        /* 終了ルーチン    */
  86. {
  87.     int    i,k;
  88.  
  89.     printf("\n");
  90.     if( gamemax==gameno )
  91.         printf(    " 全%dゲーム終了 成績表\n\n",gamemax);
  92.     put_score();
  93.     for( i=0,k=0 ; i<nplayer ; i++ )
  94.         if( win[i]>k  ) k=win[i];
  95.     printf(" 勝者は ");
  96.     for( i=0 ; i<nplayer ; i++ )
  97.         if( win[i]==k ) printf("%s ",name[i]);
  98.     printf("です.\n\n");
  99.     getch();
  100.  
  101.     printf(" 今後ともよろしく(^_^;)  by H.Gomi\n");
  102.     exit(0);
  103. }
  104.  
  105. int keywait(void)        /* 終了付キー待ち */
  106. {
  107.     int    c;
  108.  
  109. re_kw:
  110.     c=getch();
  111.     if( c=='q' || c=='Q' ) {
  112.         printf(" ゲームをやめるのですか?(y/n)\n");
  113.         c=getch();
  114.         if( c=='y' || c=='Y' )
  115.             THbaba_end();
  116.         else{
  117.             printf(" では再開します.\n\n");
  118.             goto re_kw;
  119.         }
  120.     }                /* 終了処理        */
  121.     return c;
  122. }
  123.  
  124. void deal_card(void)        /* カード配付    */
  125. {
  126.     int    i,ii,c,cc;
  127.  
  128.     for( i=0 ; i<nplayer ; i++ )
  129.         for( ii=0 ; ii<54 ; ii++ )
  130.             card[i][ii]=-1;
  131.     for( ii=0 ; ii<54 ; ii++ )
  132.             isdeal[ii]=FALSE;
  133.  
  134.     for( ii=0 ; ; ii++ ) {
  135.         for( i=0 ; i<nplayer ; i++ ) {
  136.             for( c=rand()%53,cc=c+1 ; isdeal[cc%53]==TRUE ; cc++ )
  137.                 if( cc%53==c ) goto dealoop_end;
  138.             card[ttbl[i]][ii]=cc%53;
  139.             isdeal[cc%53]=TRUE;
  140.         }
  141.     }
  142.  
  143. dealoop_end:
  144.  
  145.     return;
  146. }
  147.  
  148. int put_card(int c)        /* カード表示    */
  149. {
  150.     if( c==-1 )
  151.         return 1;
  152.     if( c!=53-1 )
  153.         printf(" %s%s",suit[c/13],numb[c%13]);
  154.     else
  155.         printf(" JOKER");
  156. }
  157.  
  158. int put_cardlist(int i)        /* カード全部表示 */
  159. {
  160.     int    ii,c;
  161.  
  162.     for( ii=0,c=0 ; ii<54 ; ii++ )
  163.         c+=1-put_card(card[i][ii]);
  164.     if( c==0 )    printf(" なし\n");
  165.         else    printf("\n");
  166.     return c;
  167. }
  168.  
  169. void getout_card(int i)        /* カードを出して、そのカードを表示 */
  170. {
  171.     int    ii,k,c,f;
  172.  
  173.     for( ii=0,f=TRUE ; ii<13 ; ii++ ) {
  174.         for( k=0,c=-1 ; k<54 ; k++ ) {
  175.             if( card[i][k]%13==ii && card[i][k]!=52 ) {
  176.                 if( c==-1 )  c=k;
  177.                 else{    put_card(card[i][c]);
  178.                     put_card(card[i][k]);
  179.                     card[i][c]=card[i][k]=-1;
  180.                     c=-1;
  181.                     f=FALSE;
  182.                 }
  183.             }
  184.         }
  185.     }
  186.  
  187.     if( f==FALSE )
  188.         printf("\n");
  189.     else
  190.         printf(" なし\n");
  191.  
  192. }
  193.  
  194. int count_card(int i)        /* カードの数を返す    */
  195. {
  196.     int ii,k;
  197.  
  198.     for( ii=0,k=0 ; ii<54 ; ii++ )
  199.         if( card[i][ii]!=-1 )    k++;
  200.     return k;
  201. }
  202.  
  203. int get_card(int i,int l,int j)    /* カードを抜き取る    */
  204. {
  205.     int    ii,k,c;
  206.  
  207.     for( ii=0,k=0 ; ii<54 ; ii++ ) {
  208.         if( card[i][ii]!=-1 ) {
  209.             if( k==l ) {
  210.                 c=card[i][ii];
  211.                 card[i][ii]=-1;
  212.                 for( ii=0,k=0 ; ii<54 ; ii++ ) {
  213.                     if( card[j][ii]==-1 ) {
  214.                         card[j][ii]=c;
  215.                         return c;
  216.                     }
  217.                 }
  218.             }
  219.             k++;
  220.         }
  221.     }
  222. }
  223.  
  224.  
  225. /*
  226.     ゲーム本体
  227.  
  228. */
  229. void baba(void)
  230. {
  231.     int    i,k,c,cc,f,n;
  232.  
  233.     put_score();
  234.     keywait();            /* スコア表示        */
  235.  
  236.  
  237.     for( i=0 ; i<nplayer ; i++ )    ttbl[i]=-1;
  238.     for( i=0 ; i<nplayer ; i++ ){
  239.         for( c=rand()%nplayer,k=c+1 ; ttbl[k%nplayer]!=-1 ; k++ );
  240.         ttbl[k%nplayer]=i;
  241.     }                /* やる順を決める    */
  242.  
  243.     printf(" 第%d回戦\n",gameno);
  244.     printf(" 順番:→");
  245.     for( i=0 ; i<nplayer ; i++ )
  246.         printf("%s→",name[ttbl[i]]);
  247.     printf("\n\n");            /* やる順を表示        */
  248.  
  249.  
  250.     deal_card();
  251.     keywait();            /* カードを配る        */
  252.  
  253.  
  254.     printf(" [最初のカード]\n");
  255.     put_cardlist(0);
  256.     printf("\n");
  257.     keywait();            /* 最初の手札表示    */
  258.  
  259.  
  260.     printf(" [出せたカード]\n");
  261.     for( i=0 ; i<nplayer ; i++ ) {
  262.         printf(" %8s :",name[ttbl[i]]);
  263.         getout_card(ttbl[i]);
  264.     }
  265.     printf("\n");
  266.     keywait();            /* 出したカードの表示    */
  267.  
  268.  
  269.     printf(" [残りのカード]\n");
  270.     for( i=0 ; i<nplayer ; i++ ) {
  271.         if( ttbl[i]==0 ){
  272.             printf(" %8s :",name[0]);
  273.             put_cardlist(0);
  274.         }else{
  275.             printf(    " %8s : あと%d枚.\n",
  276.                 name[ttbl[i]],count_card(ttbl[i]));
  277.         }
  278.     }
  279.     printf("\n");
  280.     keywait();            /* 残りカードの表示    */
  281.  
  282.  
  283.     repnt=nplayer-1;        /* 上がった時の得点の初期化 */
  284.  
  285.     for( i=0,f=0 ; i<nplayer ; i++ )
  286.         if( count_card(ttbl[i])==0 ){
  287.             printf(    " %s のカードが最初から全部無くなりました!\n",
  288.                 name[ttbl[i]]);
  289.             win[ttbl[i]]+=repnt;
  290.             f++;
  291.         }
  292.     repnt-=f;            /* いきなり上がった時の処理 */
  293.  
  294.  
  295.     printf(" ではゲーム開始です.\n\n");
  296.     keywait();
  297.  
  298.  
  299. for( ; repnt>0 ; )    /* 大ループ    */
  300.  
  301.     for( i=0 ; i<nplayer && repnt>0 ; i++ ) {
  302.  
  303.         if( count_card(ttbl[i])>0 )
  304.         if( ttbl[i]==0 ){
  305.  
  306.             for( f=1 ; f<nplayer ; f++ ) {
  307.                 k=ttbl[(i+f)%nplayer];
  308.                 c=count_card(k);
  309.                 if( c>0 ) break;
  310.             }
  311.  
  312.             printf(    " %s の番です.←%s\n",name[0],name[k] );
  313.             printf(    " 現在のカード:");
  314.             put_cardlist(0);
  315.             printf("\n");
  316.             keywait();
  317.  
  318.     if( c!=1 ) {
  319.             printf(    " %s には %d枚のカードがあります.\n"
  320.                 ,name[k],c);
  321.             do{
  322.                 printf(    " 何枚目を引きますか?(1-%d)\n",c);
  323.                 if( c>=10 ) {
  324.                     n=keywait()-'0';
  325.                     if( isdigit(cc=keywait()) )
  326.                         n=n*10+(cc-'0');
  327.                     n--;
  328.                 }else    n=keywait()-'0' -1;
  329.             }while( n<0 || c<=n );
  330.     }else{
  331.             printf(    " %s には 一枚しかカードがありません.\n"
  332.                 ,name[k]);
  333.             keywait();
  334.             n=0;
  335.     }
  336.  
  337.             printf("\n");
  338.             put_card(get_card(k,n,0));
  339.             printf("\n\n");
  340.  
  341.             printf(    " 出せたカード:");
  342.             getout_card(ttbl[i]);
  343.             printf(    " 現在のカード:");
  344.             n=put_cardlist(0);
  345.             printf("\n");
  346.             keywait();
  347.  
  348.             if( n==0 ) {
  349.                 printf(    " %s のカードが全部無くなりました.\n"
  350.                     ,name[0]);
  351.                 win[0]+=repnt--;
  352.                 if( c==1 ){
  353.                     printf(    " %s が先に上がりました.\n\n"
  354.                         ,name[0]);
  355.                     printf(    " %s も上がりました.\n\n"
  356.                         ,name[k]);
  357.                     win[k]+=repnt--;
  358.                 }else
  359.                     printf(    " %s は上がりました.\n\n"
  360.                         ,name[0]);
  361.                 keywait();
  362.             }else if( c==1 ){
  363.                 printf(    " %s のカードが全部無くなりました.\n"
  364.                     " %s は上がりました.\n\n"
  365.                     ,name[k],name[k]);
  366.                 win[k]+=repnt--;
  367.                 keywait();
  368.             }
  369.  
  370.  
  371.  
  372.  
  373.  
  374.         }else{
  375.             for( f=1 ; f<nplayer ; f++ ) {
  376.                 k=ttbl[(i+f)%nplayer];
  377.                 c=count_card(k);
  378.                 if( c>0 ) break;
  379.             }
  380.  
  381.             printf(    " %8s : あと%d枚.←%s\n",
  382.                 name[ttbl[i]],count_card(ttbl[i]),name[k] );
  383.             keywait();
  384.  
  385.     if( c!=1 ) {
  386.             n=rand()%c;
  387.     }else{
  388.             printf(    " %s には一枚しかカードがありません.\n"
  389.                 ,name[k]);
  390.             keywait();
  391.             n=0;
  392.     }
  393.  
  394.             n=get_card(k,n,ttbl[i]);
  395.             if( k==0 ) {
  396.                 printf(    " %s は",name[ttbl[i]]);
  397.                 put_card(n);
  398.                 printf(    " を取りました.\n");
  399.             }
  400.  
  401.             printf(    " 捨カード :");
  402.             getout_card(ttbl[i]);
  403.             printf("\n");
  404.             keywait();
  405.  
  406.             if( count_card(ttbl[i])==0 ) {
  407.                 printf(    " %s のカードが全部無くなりました.\n"
  408.                     ,name[ttbl[i]]);
  409.                 win[ttbl[i]]+=repnt--;
  410.                 if( c==1 ){
  411.                     printf(    " %s が先に上がりました.\n\n"
  412.                         ,name[ttbl[i]]);
  413.                     printf(    " %s も上がりました.\n\n"
  414.                         ,name[k]);
  415.                     win[k]+=repnt--;
  416.                 }else
  417.                     printf(    " %s は上がりました.\n\n"
  418.                         ,name[ttbl[i]]);
  419.                 keywait();
  420.             }else if( c==1 ){
  421.                 printf(    " %s のカードが全部無くなりました.\n"
  422.                     " %s は上がりました.\n\n"
  423.                     ,name[k],name[k]);
  424.                 win[k]+=repnt--;
  425.                 keywait();
  426.             }
  427.  
  428.         }
  429.  
  430.     }
  431.  
  432. }
  433.  
  434.  
  435. /*
  436.     メイン
  437.  
  438. */
  439. void main(int argc,char *argv[])
  440. {
  441.     int    i,k;
  442.  
  443.     printf(title);
  444.  
  445.     for( i=1 ; i<argc ; i++ )
  446.         if( *argv[i]=='-' || *argv[i]=='/' ) {
  447.             strlwr(argv[i]);
  448.             switch( *(argv[i]+1) ) {
  449.             case'h':
  450.                 printf(usage);
  451.                 exit(0);
  452.             case'r':
  453.                 printf(rule);
  454.                 exit(0);
  455.             case'p':
  456.                 nplayer=atoi(argv[i]+2);
  457.                 if( nplayer<3 || 8<nplayer ) {
  458.     printf(" プレイヤー数の指定に誤りがあります(3~8)\n");
  459.                     exit(1);
  460.                 }
  461.                 if( nplayer<4 )
  462.                     for( k=0 ; k<13 ; k++ )
  463.                         strcpy(numb[k],hnumb[k]);
  464.                 break;
  465.             case'n':
  466.                 k=atoi(argv[i]+2);
  467.                 if( k<0 || 7<k ) {
  468.     printf(" 名前番号の指定が違法です(0…自分、1~7…相手)\n");
  469.                     exit(1);
  470.                 }
  471.                 if( i==argc-1 )    name[k]="\0";
  472.                     else    name[k]=(argv[++i]);
  473.                 break;
  474.             case'g':
  475.                 gamemax=atoi(argv[i]+2);
  476.                 if( gamemax<0 ) {
  477.     printf(" 最大ゲーム数が違法です.\n");
  478.                     exit(1);
  479.                 }
  480.                 break;
  481.             case'c':
  482.                 for( k=0 ; k<13 ; k++ )
  483.                     strcpy(numb[k],hnumb[k]);
  484.                 for( k=0 ; k<4  ; k++ )
  485.                     strcpy(suit[k],hsuit[k]);
  486.                 break;
  487.             case'o':
  488.                 for( k=0 ; k<4  ; k++ )
  489.                     *suit[k]='\0';
  490.                 break;
  491.             }
  492.         }
  493.  
  494.  
  495.     srand((unsigned int)clock());
  496.     for( i=0 ; i<nplayer ; i++ )
  497.         win[i]=0;        /* データ初期化    */
  498.  
  499.  
  500.     for( ; ; gameno++ ) {
  501.         baba();            /* ゲームループ    */
  502.         if( gamemax )
  503.         if( gamemax==gameno )
  504.             THbaba_end();    /* 総ゲーム数が決まっている場合    */
  505.     }
  506.  
  507. }
  508.